#ifndef STR_ARRAY_H
#define STR_ARRAY_H

#include <stdint.h>
#include <unistd.h>

typedef uint8_t byte;

enum
{
	SqStrMaxSize = 1024,

	ERR_COMMON = -1,

	ERR_NOMEM = -2,
	ERR_INDEX = -3,

	ERR_NEQ = -4,
};

struct sq_str
{
	byte data[SqStrMaxSize];
	size_t len;
};

typedef struct sq_str sq_str;

int sq_str_create(sq_str **);
int sq_str_clone(const sq_str *, sq_str **);
int sq_str_substr(const sq_str *, size_t i, size_t j, sq_str **);
int sq_str_release(sq_str *);

#define sq_str_len(str_p) (str_p->len)

int sq_str_assign(sq_str *, const char *);
int sq_str_copy(sq_str *, const sq_str *);
int sq_str_eq(const sq_str *, const sq_str *);
int sq_str_cat(sq_str *, const sq_str *);

int sq_str_insert(sq_str *, size_t i, const sq_str *);
int sq_str_del(sq_str *, size_t i, size_t j);
int sq_str_replace(sq_str *, size_t i, size_t j, const sq_str *);

int sq_str_display(const sq_str *);

int sq_str_find_repeator(const sq_str *, const byte **, size_t * len);

int sq_str_bf(const sq_str * haystack, const sq_str * needle);
int sq_str_kmp(const sq_str * haystack, const sq_str * needle);
void test_kmp_nv();

#endif /* STR_ARRAY_H */

